home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’95 / ClockDoubler / Sample.c < prev   
C/C++ Source or Header  |  1995-06-24  |  2KB  |  97 lines

  1. void main(void)
  2. {
  3.     long oldA4;
  4.     Handle initH = 0;
  5.     
  6.     oldA4 = SetCurrentA4();
  7.     RememberA4();
  8.     
  9.     initH = Get1Resource('INIT', 333);
  10.     if(initH)
  11.         {
  12.         HackInit();
  13.         DetachResource(initH);
  14.         }
  15.         
  16.     RestoreA4(oldA4);
  17. }
  18.  
  19.  
  20. void HackInit(void)
  21.     {  
  22.     data = (DocPathDataHandle) NewHandleSys(sizeof(DocPathData));
  23.     if(data)
  24.         {
  25.         (*data)->howManyWaitingFiles    =    0;
  26.         (*data)->howManyWaitingWindows    =    0;
  27.         (*data)->links        =    (WindowFileLinkHandle)    NewHandleSys(0);
  28.         (*data)->ignoringFiles = false;
  29.         
  30.         (*data)->oldDragWindow = NGetTrapAddress (_DragWindow, ToolTrap);
  31.         NSetTrapAddress ((UniversalProcPtr)DragWindowStub, _DragWindow, ToolTrap);        
  32.  
  33.         (*data)->oldCloseWindow = NGetTrapAddress (_CloseWindow, ToolTrap);
  34.         NSetTrapAddress ((UniversalProcPtr)CloseWindowStub, _CloseWindow, ToolTrap);
  35.                 
  36.         (*data)->oldSetWTitle = NGetTrapAddress (_SetWTitle, ToolTrap);
  37.         NSetTrapAddress ((UniversalProcPtr)SetWTitleStub, _SetWTitle, ToolTrap);        
  38.  
  39.         (*data)->oldOpen = NGetTrapAddress (_Open, OSTrap);
  40.         NSetTrapAddress ((UniversalProcPtr)OpenStub, _Open, OSTrap);
  41.                 
  42.         (*data)->oldOpenRF = NGetTrapAddress (_OpenRF, OSTrap);
  43.         NSetTrapAddress ((UniversalProcPtr)OpenRFStub, _OpenRF, OSTrap);
  44.                 
  45.         (*data)->oldHFSDispatch = NGetTrapAddress (_HFSDispatch, OSTrap);
  46.         NSetTrapAddress ((UniversalProcPtr)HFSDispatchStub, _HFSDispatch, OSTrap);    
  47.             
  48.         (*data)->oldNewCWindow = NGetTrapAddress (_NewCWindow, ToolTrap);
  49.         NSetTrapAddress ((UniversalProcPtr)NewCWindowStub, _NewCWindow, ToolTrap);    
  50.             
  51.         (*data)->oldNewWindow = NGetTrapAddress (_NewWindow, ToolTrap);
  52.         NSetTrapAddress ((UniversalProcPtr)NewWindowStub, _NewWindow, ToolTrap);
  53.                 
  54.         (*data)->oldFindWindow = NGetTrapAddress (_FindWindow, ToolTrap);
  55.         NSetTrapAddress ((UniversalProcPtr)FindWindowStub, _FindWindow, ToolTrap);
  56.                 
  57.         }
  58.     }
  59.  
  60.  
  61. asm void DragWindowStub( void )
  62.     {
  63.     
  64.     // Reserve space on the stack for real DragWindow address
  65.     sub.l    #4, SP
  66.     
  67.     // save registers
  68.     movem.l A0-A5/D0-D7, -(SP)
  69.     
  70.     jsr SetUpA4
  71.     
  72.     // save real DragWindow address on the stack
  73.     move.l data, A0
  74.     move.l (A0), A0    
  75.     move.l 8(A0), 56(SP)
  76.     
  77.     // move HackDragWindow params on the stack
  78.     move.l  64(SP),-(SP) 
  79.     move.l  72(SP),-(SP)
  80.     move.l  80(SP),-(SP)
  81.     
  82.     jsr HackDragWindow
  83.     
  84.     TST.W     D0
  85.     
  86.     // resotre stack pointer
  87.     LEA    12(SP),SP
  88.     movem.l (SP)+, A0-A5/D0-D7
  89.     
  90.     BNE.S     *+4
  91.     
  92.     // forget about calling real DragWindow
  93.     add.l      #4, SP    
  94.             
  95.     rts        
  96.     }
  97.